package main

import (
	"fmt"
	"errors"
	"reflect"
)

func Foo() error {
	return errors.New("foo error")
}

func Bar() error {
	return nil
}

func main() {
	// 错误变量不因该被直接赋值，应该只用在复合的 if 语句中
	// 错误不应该直接被返回。

	// 可以选择将错误包含到一个闭包中
	//err := func () os.Error {
	//
	//	if req.Method != "GET" {
	//		return os.NewError("expected GET")
	//	}
	//
	//	if input := parseInput(req); input != "command" {
	//		return os.NewError("malformed command")
	//	}
	//
	//} ()
	//
	//if err != nil {
	//	w.WriteHeader(400)
	//	io.WriteString(w, err)
	//	return
	//}

	// 原因是 err 变量的 nil 会被看作没有错误, 因此断然赋值，会被污染
	// 会影响下面的 err 判断

	// 可以使用不同的 err 名字
	err := func () error {
		return Foo()
	} ()

	if err != nil {
		fmt.Println(err)
	}

	// 一个 error 变量在被赋值了一个 error 接口值之后
	// 第二次被赋值一个 nil(第二个操作，没有错误) 结果在 if 中判断依然是 true ??
	err1 := Foo()
	fmt.Println(reflect.TypeOf(err1))
	fmt.Printf("%+v\n", err1 != nil)

	// 赋值一个值为 nil 的 error 也没有问题啊
	err1 = Bar()
	fmt.Println(reflect.TypeOf(err1))
	fmt.Printf("%+v\n", err1 != nil)

	// 这样赋值是不行的 必须赋值一个 error 接口类型 ???
	err1 = nil
	fmt.Println(reflect.TypeOf(err1))
	fmt.Printf("%+v", err1 != nil)
}
